package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

func main() {
	// 打开一个存在的文件，将原来的内容读出显示在终端，并且追加 5 句"welcome,北京!"
	// 打开已经存在文件, d:/abc.txt
	filePath := "d:/abc.txt"
	file, err := os.OpenFile(filePath, os.O_RDWR|os.O_APPEND, 0666)
	if err != nil {
		fmt.Printf("open file err=%v\n", err)
		return
	}
	// 及时关闭 file 句柄
	defer file.Close()
	// 先读取原来文件的内容，并显示在终端.
	reader := bufio.NewReader(file)
	for {
		str, err := reader.ReadString('\n')
		if err == io.EOF { // 如果读取到文件的末尾
			break
		}
		// 显示到终端
		fmt.Print(str)
	}
	str := "welcome,北京!\r\n" // \r\n 表示换行
	// 写入时，使用带缓存的 *Writer
	writer := bufio.NewWriter(file)
	for i := 0; i < 5; i++ {
		writer.WriteString(str)
	}
	// 因为 writer 是带缓存，因此在调用 WriterString 方法时，其实内容是先写入到缓存的,所以需要调用 Flush 方法，将缓冲的数据真正写入到文件中，否则文件中会没有数据!!!
	writer.Flush()
}
